Home | History | Annotate | Download | only in Misc
      1 /*
      2  * [The "BSD license"]
      3  * Copyright (c) 2011 Terence Parr
      4  * All rights reserved.
      5  *
      6  * Conversion to C#:
      7  * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc.
      8  * All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. The name of the author may not be used to endorse or promote products
     19  *    derived from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 namespace Antlr.Runtime.Misc
     34 {
     35     using System.Collections.Generic;
     36     using InvalidOperationException = System.InvalidOperationException;
     37 
     38     public class ListStack<T> : List<T>
     39     {
     40         public T Peek()
     41         {
     42             return Peek(0);
     43         }
     44 
     45         public T Peek(int depth)
     46         {
     47             T item;
     48             if (!TryPeek(depth, out item))
     49                 throw new InvalidOperationException();
     50 
     51             return item;
     52         }
     53 
     54         public bool TryPeek(out T item)
     55         {
     56             return TryPeek(0, out item);
     57         }
     58 
     59         public bool TryPeek(int depth, out T item)
     60         {
     61             if (depth >= Count)
     62             {
     63                 item = default(T);
     64                 return false;
     65             }
     66 
     67             item = this[Count - depth - 1];
     68             return true;
     69         }
     70 
     71         public T Pop()
     72         {
     73             T result;
     74             if (!TryPop(out result))
     75                 throw new InvalidOperationException();
     76 
     77             return result;
     78         }
     79 
     80         public bool TryPop(out T item)
     81         {
     82             if (Count == 0)
     83             {
     84                 item = default(T);
     85                 return false;
     86             }
     87 
     88             item = this[Count - 1];
     89             RemoveAt(Count - 1);
     90             return true;
     91         }
     92 
     93         public void Push(T item)
     94         {
     95             Add(item);
     96         }
     97     }
     98 }
     99